// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Logo Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//
private alias 3 : TYPE_LOGO

public alias saveRAM[306] : saved.TitleStyle

// Function declarations
reserve function Logo_Function1
reserve function AnimatedForever

private alias object.value0  : object.timer
private alias object.value1  : object.playerPos.x
private alias object.value2  : object.playerPos.y
private alias object.value3  : object.paletteTimer
private alias object.value4  : object.arrayPos
private alias object.value5  : object.armFrame
private alias object.value6  : object.armPos.x
private alias object.value7  : object.armPos.y
private alias object.value8  : object.charTitlePos
private alias object.value9  : object.speedPercent
private alias object.value10 : object.disablePaletteRotation // Not actually used as far as I can tell
private alias object.value11 : object.player2Pos.x
private alias object.value12 : object.player2Pos.y
private alias object.value13 : object.p2Frame
private alias object.value14 : object.levelSelectCheatPos
private alias object.value15 : object.debugModeCheatPos
private alias object.value16 : object.regionSwitchCheatPos
private alias object.value17 : object.character

// Knux States
private alias 0  : LOGO_SETUP_KNUX
private alias 1  : LOGO_FADEIN_KNUX
private alias 2  : LOGO_RISEDELAY_KNUX
private alias 3  : LOGO_RISE_KNUX
private alias 4  : LOGO_ANIMATE_KNUX
private alias 5  : LOGO_ARMAPPEAR_KNUX
private alias 6  : LOGO_ANIMATEARM_KNUX
private alias 7  : LOGO_MOVEARM_KNUX
private alias 8  : LOGO_PREPLOGOAPPEAR_KNUX
private alias 9  : LOGO_ARMAPPEAR2_KNUX
private alias 10 : LOGO_ANIMATEARM2_KNUX
private alias 11 : LOGO_MOVEARM2_KNUX
private alias 12 : LOGO_SHOWLOGO_KNUX
private alias 13 : LOGO_IDLE_KNUX


// Tables
public table Logo_table0
	0x6060A0, 0x80A0E0, 0xE08000, 0xE0C080, 0xA04000, 0x600000, 0xE02080, 0xE00040, 0x800000, 0x806080, 0xA08060, 0xE0C0A0, 0x80A0A0, 0xA04020
end table

public table Logo_table1
	-50, -40, -53, -56, -58, -68, -60, -74, -62, -78, -63, -79, -64, -80
end table

public table Logo_table2
	5, -32, 6, -31
end table

function AnimatedForever
	if object.state > 4
		if object.value21 < 19
			temp0 = object.value21
			temp0 += 13
			DrawSpriteScreenXY(temp0, screen.xcenter, object.ypos)
			object.value22++
			object.value22 &= 1
			if object.value22 == 1
				object.value21++
			end if
		end if	
	end if
end function


function Logo_Function1
	temp0 = 0
	if inputPress.up == 1
		temp0 = 1
	end if
	if inputPress.down == 1
		temp0 = 2
	end if
	if inputPress.left == 1
		temp0 = 3
	end if
	if inputPress.right == 1
		temp0 = 4
	end if
	if inputPress.buttonA == 1
		temp0 = 5
	end if
	if inputPress.buttonB == 1
		temp0 = 6
	end if
	if inputPress.buttonC == 1
		temp0 = 7
	end if
	switch object.value14
	case 0
		if temp0 == 1
			object.value14++
		else
			if temp0 != 0
				object.value14 = 0
			end if
		end if
		break
	case 1
		if temp0 == 2
			object.value14++
		else
			if temp0 != 0
				object.value14 = 0
			end if
		end if
		break
	case 2
		if temp0 == 3
			object.value14++
		else
			if temp0 != 0
				object.value14 = 0
			end if
		end if
		break
	case 3
		if temp0 == 4
			object.value14++
			//object.value14 = 0
			options.stageSelectFlag = 1
			PlaySfx(SfxName[Ring L], 0)
		else
			if temp0 != 0
				object.value14 = 0
			end if
		end if
		break
	end switch
	switch object.value15
	case 0
		if temp0 == 1
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 1
		if temp0 == 7
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 2
		if temp0 == 2
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 3
		if temp0 == 7
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 4
		if temp0 == 3
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 5
		if temp0 == 7
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 6
		if temp0 == 4
			object.value15++
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	case 7
		if temp0 == 7
			object.value15++
			//object.value15 = 0
			stage.debugMode = 1
			PlaySfx(SfxName[Ring L], 0)
			
			//also activate level select
			object.value14 = object.value15
			options.stageSelectFlag = 1
			
		else
			if temp0 != 0
				object.value15 = 0
			end if
		end if
		break
	end switch
	switch object.value16
	case 0
		if temp0 == 1
			object.value16++
		else
			if temp0 != 0
				object.value16 = 0
			end if
		end if
		break
	case 1
	case 2
	case 3
	case 4
		if temp0 == 2
			object.value16++
		else
			if temp0 != 0
				object.value16 = 0
			end if
		end if
		break
	case 5
		if temp0 == 1
			object.value16++
			object.value16 = 0
			saveRAM[278] ^= 1
			switch saveRAM[278]
				case 0
					PlaySfx(SfxName[Hurt], 0)
					break
				case 1
					PlaySfx(SfxName[Ring L], 0)
					break
			end switch		
			WriteSaveRAM()
		else
			if temp0 != 0
				object.value16 = 0
			end if
		end if
		break
	end switch
	
	switch object.value17
	case 0
		if temp0 == 3
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 1
		if temp0 == 3
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 2
		if temp0 == 3
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 3
		if temp0 == 4
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 4
		if temp0 == 4
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 5
		if temp0 == 4
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 6
		if temp0 == 1
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 7
		if temp0 == 1
			object.value17++
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	case 8
		if temp0 == 1
			object.value17++
			object.value17 = 0
			saveRAM[279] ^= 1
			switch saveRAM[279]
				case 0
					PlaySfx(SfxName[Hurt], 0)
					break
				case 1
					PlaySfx(SfxName[Ring L], 0)
					break
			end switch			
			WriteSaveRAM()
		else
			if temp0 != 0
				object.value17 = 0
			end if
		end if
		break
	end switch
end function


event ObjectMain
	if object.state == 0
		stage.playerListPos = 0
		options.gameMode = 0
	end if
	
	if object.value10 == 0
		object.value3++
		if object.value3 == 6
			object.value3 = 0
			RotatePalette(0, 192, 195, 1)
		end if
	end if
	if options.gameMode == 0
		//if object.state > 3
		if object[+1].value10 == 0
			CallFunction(Logo_Function1)
		end if
		//end if
	end if
end event


event ObjectDraw
	if object[+1].value10 == 1
		DrawRect(0, 0, screen.xsize, screen.ysize, 0, 0, 0, 255)
	end if
	temp0 = 1

	if temp0 != 0
		DrawSpriteScreenXY(9, screen.xcenter, object.ypos)
	end if

		switch object.state
		case 0
			screen.xoffset = 0
			object.priority = PRIORITY_ACTIVE
			object.value0 = 256
			stage[0].activeLayer = 1
			object.state++
			SetScreenFade(0, 0, 0, 255)
					object[+1].type = TypeName[Start Message]
					object[+1].priority = PRIORITY_ACTIVE
					object[+1].xpos = screen.xcenter
					object[+1].ypos = 192
			break
		case 1
			screen.xoffset += 2
			if object.value0 > 0
				object.value0 -= 8
			else
				PlayMusic(0)
				object.state++
			end if
			SetScreenFade(0, 0, 0, object.value0)
			break
		case 2
			screen.xoffset += 2
			object.value0++
			if object.value0 == 38
				object.value0 = 0
				object.value2 = 186
				object.frame = 0
				object.state++
			end if
			break
		case 3
			screen.xoffset += 2
			object.value2 -= 8
			if object.value2 < 144
				object.frame = 1
			end if
			if object.value2 <= 112
				object.value2 = 112
				object.state++
			end if
			DrawSpriteScreenXY(object.frame, screen.xcenter, object.value2)
			break
		case 4
			screen.xoffset += 2
			object.value0++
			if object.value0 == 8
				if object[+1].value10 == 0
					object.frame++
				end if
				if object.frame >= 7
					object.frame = 7
					//object[+1].type = TypeName[Start Message]
					//object[+1].priority = PRIORITY_ACTIVE
					//object[+1].xpos = screen.xcenter
					//object[+1].ypos = 192
					if saved.TitleStyle == 1
						object[+1].ypos 	= 216
						object.state++
					else
						object.state = 7
					end if
				end if
				object.value0 = 0
			end if
			DrawSpriteScreenXY(object.frame, screen.xcenter, object.value2)
			break
		case 5
			screen.xoffset += 2		
			object.yvel += 0x4000
			object.speedPercent += object.yvel
			temp0 = object.speedPercent
			temp0 >>= 16
			object.ypos += temp0
			object.playerPos.y += temp0
			object.armPos.y += temp0
			object.speedPercent &= 0xFFFF

			if object.yvel > 0
				if object.ypos >= 24
					object.yvel >>= 1
					temp0 = object.yvel
					temp0 >>= 1
					object.yvel += temp0
					object.timer++
					if object.timer != 3
						FlipSign(object.yvel)
					else
						object.timer = 0
						object.yvel = 0
						object.state++
					end if
				end if
			end if
			DrawSpriteScreenXY(9, screen.xcenter, object.ypos)
			DrawSpriteScreenXY(object.frame, screen.xcenter, object.value2)			
			break
			
		case 6
			screen.xoffset += 2

			object.yvel += 0x4000
			object.speedPercent += object.yvel
			temp0 = object.speedPercent
			temp0 >>= 16
			object.charTitlePos += temp0
			object.speedPercent &= 0xFFFF

			if object.yvel > 0
				if object.charTitlePos >= 89
					object.yvel >>= 2
					temp0 = object.yvel
					temp0 >>= 1
					object.yvel += temp0
					object.timer++
					if object.timer != 2
						FlipSign(object.yvel)
					else
						object.timer = 0
						object.yvel = 0
						object.state++
					end if
				end if
			end if

			DrawSpriteScreenXY(9, screen.xcenter, object.ypos)
			DrawSpriteScreenXY(object.frame, screen.xcenter, object.value2)	
			DrawSpriteScreenXY(32, screen.xcenter, object.charTitlePos) // "shaodw In" sprite
			break
		case 7
			screen.xoffset += 2
			object.value0++
			if object.value0 == 8
				if object[+1].value10 == 0
					object.frame++
				end if
				if object.frame > 8
					object.frame = 7
				end if
				object.value0 = 0
			end if
			DrawSpriteScreenXY(9, screen.xcenter, object.ypos)
			DrawSpriteScreenXY(object.frame, screen.xcenter, object.value2)
			if saved.TitleStyle == 1
				DrawSpriteScreenXY(32, screen.xcenter, object.charTitlePos) // "shaodw In" sprite	
			end if
			break			
		end switch

	DrawSpriteScreenXY(10, screen.xcenter, object.ypos)
	CallFunction(AnimatedForever)
	temp0 = screen.xsize
	temp0 -= 96
	DrawSpriteScreenXY(11, temp0, 216)
	DrawSpriteScreenXY(12, 25, 225)
end event


event ObjectStartup
	LoadSpriteSheet("Title/Title.gif")
	SetMusicTrack("Titlescreen.ogg", 0, 0)
	switch saved.TitleStyle
	case 0
		SpriteFrame(-33, -74, 65, 64, 1, 1) //0 Sonic
		SpriteFrame(-33, -74, 65, 88, 1, 1)
		SpriteFrame(-34, -66, 74, 88, 67, 1)
		SpriteFrame(-34, -66, 74, 88, 142, 1)
		SpriteFrame(-32, -72, 79, 88, 217, 1)
		SpriteFrame(-24, -74, 72, 88, 297, 1)
		SpriteFrame(-36, -76, 81, 88, 370, 1)
		SpriteFrame(-36, -76, 81, 88, 1, 90)
		SpriteFrame(-36, -76, 81, 88, 83, 90)
	break
	case 1
		SpriteFrame(-40, -81, 78, 71, 452, 1) //0 Shadow
		SpriteFrame(-42, -74, 88, 75, 531, 1)
		SpriteFrame(-40, -74, 78, 75, 620, 1)
		SpriteFrame(-44, -87, 86, 88, 699, 1)
		SpriteFrame(-44, -93, 84, 94, 786, 1)
		SpriteFrame(-43, -81, 87, 81, 871, 1)
		SpriteFrame(-38, -87, 85, 88, 512, 77)
		SpriteFrame(-39, -87, 85, 87, 598, 79)
		SpriteFrame(-39, -87, 85, 87, 598, 79)
	break
	end switch
	SpriteFrame(-128, 42, 256, 74, 255, 90) //9 Logo Top
	SpriteFrame(-128, 112, 256, 74, 255, 167) //10 Logo Bottom
	SpriteFrame(0, 0, 71, 17, 182, 210) //11 Copyright Sega
	SpriteFrame(-2, 0, 128, 8, 155, 242) //12 Team Forever
	
	//Forever Animated
	SpriteFrame(19, 148, 46, 7, 1, 319) //13
	SpriteFrame(19, 148, 46, 7, 48, 319) //14
	SpriteFrame(19, 148, 46, 7, 95, 319) //15
	SpriteFrame(19, 148, 46, 7, 142, 319) //16
	SpriteFrame(19, 148, 46, 7, 1, 327) //17
	SpriteFrame(19, 148, 46, 7, 48, 327) //18
	SpriteFrame(19, 148, 46, 7, 95, 327) //19
	SpriteFrame(19, 148, 46, 7, 142, 327) //20
	SpriteFrame(19, 148, 46, 7, 1, 335) //21
	SpriteFrame(19, 148, 46, 7, 48, 335) //22
	SpriteFrame(19, 148, 46, 7, 95, 335) //23
	SpriteFrame(19, 148, 46, 7, 142, 335) //24
	SpriteFrame(19, 148, 46, 7, 1, 343) //25
	SpriteFrame(19, 148, 46, 7, 48, 343) //26
	SpriteFrame(19, 148, 46, 7, 95, 343) //27
	SpriteFrame(19, 148, 46, 7, 142, 343) //28
	SpriteFrame(19, 148, 46, 7, 1, 351) //29
	SpriteFrame(19, 148, 46, 7, 48, 351) //30
	SpriteFrame(19, 148, 46, 7, 95, 351) //31
	
	SpriteFrame(-95, -76, 190, 62, 512, 166) //32 shitshow the hedge-edge
	
	temp0 = 208
	temp1 = 0
	while temp1 < 14
		GetTableValue(temp2, temp1, Logo_table0)
		SetPaletteEntry(0, temp0, temp2)
		temp0++
		temp1++
	loop
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
